package com.regan.erp.conf;

import com.alibaba.druid.filter.logging.Log4jFilter;
import com.jfinal.config.*;
import com.jfinal.core.JFinal;
import com.jfinal.kit.PathKit;
import com.jfinal.kit.Prop;
import com.jfinal.kit.PropKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.tx.TxByActionKeyRegex;
import com.jfinal.plugin.druid.DruidPlugin;
import com.jfinal.plugin.redis.RedisPlugin;
import com.jfinal.template.Engine;
import com.regan.erp.aop.AnnotationParaInterceptor;
import com.regan.erp.aop.AuthPermissionInterceptor;
import com.regan.erp.aop.MyExceptionInterceptor;
import com.regan.erp.aop.UserLoginInterceptor;
import com.regan.erp.api.ApiController;
import com.regan.erp.api.DocController;
import com.regan.erp.controller.*;
import com.regan.erp.model._MappingKit;
import com.regan.erp.util.BannerUtil;
import com.regan.erp.util.ConfigUtil;

/**
 * 本 demo 仅表达最为粗浅的 jfinal 用法，更为有价值的实用的企业级用法
 * 详见 JFinal 俱乐部: http://jfinal.com/club
 * <p>
 * API引导式配置
 */
public class ErpConfig extends JFinalConfig {

    /**
     * 运行此 main 方法可以启动项目，此main方法可以放置在任意的Class类定义中，不一定要放于此
     * <p>
     * 使用本方法启动过第一次以后，会在开发工具的 debug、run config 中自动生成
     * 一条启动配置，可对该自动生成的配置再添加额外的配置项，例如 VM argument 可配置为：
     * -XX:PermSize=64M -XX:MaxPermSize=256M
     */
    public static void main(String[] args) {
        System.setProperty("org.eclipse.jetty.server.Request.maxFormContentSize","-1");
        System.setProperty("org.eclipse.jetty.server.Request.maxFormKeys","-1");
        /**
         * 特别注意：Eclipse 之下建议的启动方式
         */
        //JFinal.start("src/main/webapp", 8083, "/", 5);

        /**
         * 特别注意：IDEA 之下建议的启动方式，仅比 eclipse 之下少了最后一个参数
         */
       JFinal.start(PathKit.getRootClassPath(), 8080, "/");

    }

    /**
     * 配置常量
     */
    @Override
    public void configConstant(Constants me) {
        // 加载少量必要配置，随后可用PropKit.get(...)获取值
        PropKit.use("db_config.properties");
        me.setDevMode(ConfigUtil.dbConfig().getBoolean("devMode", false));
    }
    /**
     * 配置路由
     * //
     */
    @Override
    public void configRoute(Routes me) {
        me.add("/", IndexController.class);
        me.add("/api", ApiController.class);
        me.add("/doc", DocController.class);
        me.add("/user", UserController.class);
        me.add("/menu", MeunController.class);
        me.add("/dict", DictController.class);
        me.add("/role", RoleController.class);
    }

    @Override
    public void configEngine(Engine me) {

    }

    /**
     * 配置插件
     */
    @Override
    public void configPlugin(Plugins me) {
        //读取数据库配置信息
        Prop dbConfig = ConfigUtil.dbConfig();

        // 配置 druid 数据库连接池插件
        DruidPlugin druidPlugin = new DruidPlugin(dbConfig.get("jdbcUrl"), dbConfig.get("user"), dbConfig.get("password").trim());

        // 配置log插件 方便打印sql
        Log4jFilter logFilter = new Log4jFilter();
        logFilter.setStatementLogEnabled(false);
        logFilter.setStatementLogErrorEnabled(true);
        logFilter.setStatementExecutableSqlLogEnable(true);
        druidPlugin.addFilter(logFilter);
        me.add(druidPlugin);

        // 配置redis插件
        RedisPlugin redisPlugin = new RedisPlugin("redis", dbConfig.get("redis_host"), dbConfig.getInt("redis_port"), 6000,dbConfig.get("redis_pass"),Integer.parseInt(dbConfig.get("redis_db")));
        me.add(redisPlugin);

        // 配置ActiveRecord插件
        ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin);
        //sql模板文件
        arp.setBaseSqlTemplatePath(PathKit.getRootClassPath());
        arp.addSqlTemplate("mapping/all_sqls.sql");
        // 所有映射在 MappingKit 中自动化搞定
        _MappingKit.mapping(arp);
        me.add(arp);

    }

    /**
     * 配置全局拦截器
     */
    @Override
    public void configInterceptor(Interceptors me) {
        /** 自定义异常拦截 */
        me.add(new MyExceptionInterceptor());
        /** 自定义用户超时拦截 */
        me.add(new UserLoginInterceptor());
        /** 注解拦截器 */
        me.add(new AnnotationParaInterceptor());
        /** 权限拦截器 */
        me.add(new AuthPermissionInterceptor());
        // 事务控制器
        me.add(new TxByActionKeyRegex("(.*save.*|.*update.*|.*create.*|.*del.*)",true));
    }

    /**
     * 配置处理器
     */
    @Override
    public void configHandler(Handlers me) {

    }

    @Override
    public void afterJFinalStart() {
        System.out.println(BannerUtil.getBanner());
        System.out.println("启动成功\n");
    }
}
